home *** CD-ROM | disk | FTP | other *** search
- ;**************************
- ;* *
- ;* High-C用 RS-232C ライブラリー *
- ;* Programmed by 山崎憲明 *
- ;* NIFTY ID=QGB01416 *
- ;* nanno-NET ID= YAMA *
- ;* *
- ;**************************
- ;
- ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;
- ; v0.01 Makeing by YAMA
- ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;
- ;セグメント宣言
- ;
- rmdata segment dword public 'DATA' use16
- rmdata ends
- RSBcode segment dword public 'CODE' use32
- RSBcode ends
-
-
- rsb_para_s struc ;9 artcles 17 bytes
- mode db ?
- baud db ?
- rbuf dd ?
- stime dw ?
- rtime dw ?
- rinf dd ?
- extn db ?
- xon db ?
- xoff db ?
- rsb_para_s ends
-
- ;
- ;定数
- ;
-
- TRUE equ 1
- FALSE equ 0
-
- assume cs:RSBcode,ds:rmdata
-
- ;
- ;リアルモードデータセグメント
- ;
-
- rmdata segment
- ;
- ;
- ;
-
- real_seg dw 0 ;データエリアのリアルモードセグメント値
-
- rm_int_no dw 0 ;int no.
- rm_ds dw 0 ;リアルモードds
- rm_es dw 0 ;リアルモードes
- rm_fs dw 0 ;リアルモードfs
- rm_gs dw 0 ;リアルモードgs
- rm_eax dd 0 ;リアルモードeax
- rm_edx dd 0 ;リアルモードedx
-
- ;
- ; データ領域
- ;
- rsb_para rsb_para_s <> ;パラメータエリア
-
- buf_size equ 1024*5 ;受信バッファサイズ(5Kbyte)
- rsb_buf label byte
- dw buf_size
- dw 0 ;文字カウント
- dw 0 ;入力ポインタ
- dw 0 ;出力ポインタ
- db buf_size+16 dup(0) ;受信バッファ
-
-
- public rsb_end_real ;リアルモードエンドアドレス
- rsb_end_real label byte
-
- rmdata ends
-
- ;
- ;
- ;
- ;
- ;プロテクトモードーコード
- ;
-
- RSBcode segment
-
- ;
- ;プロテクトルーチン
- ;
-
- ;データセグメントのリアルモードセグメント値の算定
-
- set_real_seg proc near
-
- mov ax,ds ;リアルモード用セグメント算定
- mov es,ax ;先頭アドレス
- xor ebx,ebx ;
- lea ecx,rsb_end_real;リアルモードコードセグメントサイズ
- mov ax,250Fh ;プロテクト=>リアルアドレス変換
- int 21h
- ;jc err ;エラー処理
- ;test ecx,0FFFFh ;
- ;jnz err ;
- shr ecx,16
- mov real_seg,cx ;リアルモードセグメント値設定
-
- ret
- set_real_seg endp
-
-
- ;リアルモード割り込み発行(ポインター指定付)
-
- int_9Bh_2 proc near
-
- mov rm_eax,eax
- mov rm_edx,edx
-
- mov cx,real_seg
- mov rm_ds,cx ;ds設定
- mov rm_es,cx ;es設定
- mov rm_fs,cx ;fs設定
- mov rm_gs,cx ;gs設定
-
- mov byte ptr rm_int_no,9Bh ;int no.
- mov edx,offset rm_int_no
- mov ax,2511h
- int 21h
- mov edx,rm_edx
- ret
- int_9Bh_2 endp
-
-
- ;回線オープン
- ;int RSB_open(int port);
- ;
- public RSB_open
- RSB_open proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
-
- mov eax,[ebp][8] ;引数 1( int port )
- mov ah,01h ;open
- int 9Bh
- movzx eax,ah
-
- pop ebp ;High-C用後処理
- ret
- RSB_open endp
-
- ;回線クローズ
- ;int RSB_close(int port);
- ;
- public RSB_close
- RSB_close proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
-
- mov eax,[ebp][8] ;引数 1( int port )
- mov ah,02h ;close
- int 9Bh
- movzx eax,ah
-
- pop ebp ;High-C用後処理
- ret
- RSB_close endp
-
- ;通信パラメータ設定
- ;int RSB_setpara(int port,char *para);
- ;
- public RSB_setpara
- RSB_setpara proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
- push es
- push esi
- push edi
- push ebx
- push ecx
-
- call set_real_seg
-
- mov esi,[ebp][12] ;引数 2( char *para )
- mov edi,offset rsb_para
- mov ecx,11h
- rep movsb
-
- mov esi,[ebp][12] ;引数 2( char *para )
- mov edi,offset rsb_para
- mov ax,real_seg ;受信バッファアドレスが
- mov word ptr[edi].rbuf+2,ax ;独自バッファを指すように
- mov eax,offset rsb_buf ;リアル、ネイティブ両ポインタ
- mov [esi].rbuf,eax ;を修正
- mov word ptr[edi].rbuf,ax ;
-
- mov ax,buf_size
- mov word ptr[rsb_buf],ax ; buff Size Init Apend by Ken
-
- mov [esi].rinf,0 ;受信通知せず
- mov [edi].rinf,0 ;
-
- mov eax,[ebp][8] ;引数 1( int port )
- mov ah,03h ;setpara
- mov edi,offset rsb_para
- call int_9Bh_2
- movzx eax,ah
-
- pop ecx
- pop ebx ;High-C用後処理
- pop edi
- pop esi
- pop es
- pop ebp
- ret
- RSB_setpara endp
-
- ;通信パラメータ読み取り
- ;int RSB_rdpara(int port,char *para);
- ;
- public RSB_rdpara
- RSB_rdpara proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
- push es
- push esi
- push edi
- push ebx
- push ecx
-
- call set_real_seg
-
- mov eax,[ebp][8] ;引数 1( int port )
- mov ah,04h ;rdpara
- mov edi,offset rsb_para
- call int_9Bh_2
-
- mov esi,offset rsb_para
- mov edi,[ebp][12] ;引数 2( char *para )
- mov ecx,11h
- rep movsb
-
- movzx eax,ah
-
- pop ecx
- pop ebx ;High-C用後処理
- pop edi
- pop esi
- pop es
- pop ebp
- ret
- RSB_rdpara endp
-
-
- ;受信データ数の読み取り
- ;int RSB_read(int port, int *len);
- ;
- public RSB_read
- RSB_read proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
- push edi
-
- mov eax,[ebp][8] ;引数 1( int port )
- mov ah,05h ;read
- int 9Bh
- movzx edx,dx
- mov edi,[ebp][12] ;引数 2( int *len )
- mov [edi],edx
- movzx eax,ah
-
- pop edi ;High-C用後処理
- pop ebp
- ret
- RSB_read endp
-
-
- ;データの受信
- ;int RSB_receive(int port,int *ch,int *st);
- ;注:<return>=エラーno.(ah) ch=data(dl) st=ステータス(h:dh,l:cl)
- ;
- public RSB_receive
- RSB_receive proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
- push es
- push esi
- push edi
- push ebx
- push ecx
-
- mov eax,[ebp][8] ;引数 1( int port )
- mov ah,06h ;receive
- int 9Bh
- mov ch,dh
- movzx ecx,cx
- movzx edx,dl
- mov edi,[ebp][12] ;引数 2( int *ch )
- mov [edi],edx
- mov edi,[ebp][16] ;引数 3( int *st )
- mov [edi],ecx
- movzx eax,ah
-
- pop ecx
- pop ebx ;High-C用後処理
- pop edi
- pop esi
- pop es
- pop ebp
- ret
- RSB_receive endp
-
-
- ;データの送信
- ;int RSB_send(int port,int ch,int *st);
- ;注:<return>=エラーno.(ah) st=ステータス(l:dh)
- ;
-
- public RSB_send
- RSB_send proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
- push es
- push esi
- push edi
- push ebx
- push ecx
-
- mov eax,[ebp][8] ;引数 1( int port )
- mov edx,[ebp][12] ;引数 2( int ch )
- mov ah,07h ;send
- int 9Bh
- movzx edx,dh
- mov edi,[ebp][16] ;引数 3( int *st )
- mov [edi],edx
- movzx eax,ah
-
- pop ecx
- pop ebx ;High-C用後処理
- pop edi
- pop esi
- pop es
- pop ebp
- ret
- RSB_send endp
-
- ;拡張DTR信号の保持設定
- ;int RSB_dtr(int port,int sw);
- ;
-
- public RSB_dtr
- RSB_dtr proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
-
- mov eax,[ebp][8] ;引数 1( int port )
- mov edx,[ebp][12] ;引数 2( int sw )
- mov ah,0Eh ;dtr
- int 9Bh
- movzx eax,ah
-
- pop ebp ;High-C用後処理
- ret
- RSB_dtr endp
-
- ;Break信号の送信
- ;int RSB_break(int port,int sec);
- ;
-
- public RSB_break
- RSB_break proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
-
- mov eax,[ebp][8] ;引数 1( int port )
- mov edx,[ebp][12] ;引数 2( int sec )
- mov ah,0Bh ;break
- int 9Bh
- movzx eax,ah
-
- pop ebp ;High-C用後処理
- ret
- RSB_break endp
-
- RSBcode ends
-
- end